package others;

import java.util.Stack;

/**
 * @author pengfei.hpf
 * @date 2020/3/7
 * @verdion 1.0.0
 * 给定一个包含正整数、加(+)、减(-)、乘(*)、除(/)的算数表达式(括号除外)，计算其结果。
 *
 * 表达式仅包含非负整数，+， - ，*，/ 四种运算符和空格  。 整数除法仅保留整数部分。
 *
 * 示例 1:
 *
 * 输入: "3+2*2"
 * 输出: 7
 * 示例 2:
 *
 * 输入: " 3/2 "
 * 输出: 1
 * 示例 3:
 *
 * 输入: " 3+5 / 2 "
 * 输出: 5
 * 说明：
 *
 * 你可以假设所给定的表达式都是有效的。
 * 请不要使用内置的库函数 eval。
 *
 * 来源：力扣（LeetCode）
 * 链接：https://leetcode-cn.com/problems/calculator-lcci
 * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 */
public class Calculate {
    public int calculate(String s){
        if(s == null || s.length() == 0){
            return 0;
        }
        Stack<Integer> stack = new Stack<>();
        char sign = '+';
        s = s.trim();
        char[] chars = s.toCharArray();
        int num = 0;
        int len = chars.length;
        for(int i = 0 ; i < len; i++){
            char c = chars[i];

            if(c == ' '){
                continue;
            }
            if(isDig(c)){
                num = num * 10 + (c - '0');
            }
            if(!isDig(c) || i == len - 1){
                switch (sign){
                    case '+':
                        stack.push(num);
                        break;
                    case '-':
                        stack.push(-num);
                        break;
                    case '*':
                        int last = stack.pop();
                        num = last * num;
                        stack.push(num);
                        break;
                    case '/':
                        last = stack.pop();
                        num = last / num;
                        stack.push(num);
                        break;
                }

                sign = c;
                num = 0;
            }
        }
        int res = 0;
        while(!stack.isEmpty()){
            res += stack.pop();
        }
        return res;

    }

    private boolean isDig(char c){
        return c >= '0' && c <= '9';
    }
}
